package com.example.blog.modules.article.service;

import com.example.blog.modules.article.dto.ArticleDTO;
import com.example.blog.modules.article.dto.ArticleQuery;
import com.example.blog.modules.article.dto.ArticleRequest;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import org.springframework.core.io.Resource;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.validation.annotation.Validated;

import java.time.LocalDate;
import java.util.List;

@Validated
public interface ArticleService {
    /**
     * 创建文章
     */
    ArticleDTO createArticle(@NotNull @Valid ArticleRequest request);

    /**
     * 更新文章
     */
    ArticleDTO updateArticle(@NotNull @Min(1) Long id, @NotNull @Valid ArticleRequest request);

    /**
     * 获取文章详情
     */
    ArticleDTO getArticle(@NotNull @Min(1) Long id);

    /**
     * 获取文章列表
     */
    Page<ArticleDTO> getArticles(@Valid ArticleQuery query, @NotNull Pageable pageable);

    /**
     * 删除文章
     */
    void deleteArticle(@NotNull @Min(1) Long id);

    /**
     * 发布文章
     */
    void publishArticle(@NotNull @Min(1) Long id);

    /**
     * 取消发布文章
     */
    void unpublishArticle(@NotNull @Min(1) Long id);

    /**
     * 推荐文章
     */
    void recommendArticle(@NotNull @Min(1) Long id);

    /**
     * 取消推荐文章
     */
    void unrecommendArticle(@NotNull @Min(1) Long id);

    /**
     * 增加文章浏览量
     */
    void incrementViewCount(@NotNull @Min(1) Long id);

    /**
     * 获取热门文章
     */
    List<ArticleDTO> getPopularArticles();

    /**
     * 获取相关文章
     */
    List<ArticleDTO> getRelatedArticles(@NotNull @Min(1) Long articleId);

    /**
     * 获取分类文章
     */
    Page<ArticleDTO> getArticlesByCategory(@NotNull @Min(1) Long categoryId, @NotNull Pageable pageable);

    /**
     * 获取标签文章
     */
    Page<ArticleDTO> getArticlesByTag(@NotNull @Min(1) Long tagId, @NotNull Pageable pageable);

    /**
     * 获取推荐文章
     */
    List<ArticleDTO> getRecommendedArticles(@Min(1) int limit);

    /**
     * 导出文章数据
     */
    Resource exportArticles(
        @NotNull(message = "开始日期不能为空") LocalDate startDate,
        @NotNull(message = "结束日期不能为空") LocalDate endDate,
        @NotNull(message = "导出格式不能为空") String format);
} 